class Observer{
    constructor(data){
        this.walk(data)
    }
    walk (data){
        //是否对象
        if(!data || typeof data !=='object'){
            return
        }
        Object.keys(data).forEach(key=>{
            this.defineReactive(data,key,data[key])
        })
    }
    defineReactive(obj,key,val){
        let that=this
        //负责收集依赖,
        let dep = new Dep()
        Object.defineProperty(obj,key,{
            configurable:true,
            enumerable:true,
            get(){
                // 如果observer的get return data[key] 会产生死递归
                // 因为 访问key属性,就触发get,然后又访问obj[key],又触发get 会产生死递归
                // 第三个参数,形成闭包,后续可以访问

                //添加依赖
                Dep.target&&dep.addSub(Dep.target)

                return val
            },
            set(newValue){
                if(newValue===val){
                    return
                }else{
                    //that 
                    that.walk(newValue)
                    val=newValue
                }
                //发送通知
                dep.notify()
            }
        })
        this.walk(val)
    }
}